# 使用OpenCV采集图像
import cv2

# 打开系统中的第一个摄像头，CAP_DSHOW参数防止出现告警
# camera = cv2.VideoCapture(0, cv2.CAP_DSHOW)
# 打开远程摄像头
camera = cv2.VideoCapture("http://admin:admin@192.168.74.213:8081")

# 创建窗口
cv2.namedWindow("camera")

while camera.isOpened():
    # 从摄像头读取一帧图像
    status,frame = camera.read()
    if status:
        # 将采集到的图像先转为灰度图，确定二值化阈值
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        # 进行模糊处理，减少图像中的细节，方便进行二值化处理
        blur = cv2.blur(gray, (10, 10))
        # 二值化处理
        binary = cv2.threshold(blur, 200, 255, cv2.THRESH_BINARY)[1]
        # 查找轮廓
        contours = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
        if len(contours):
            # 获取面积最大的轮廓
            c = max(contours, key=cv2.contourArea)
            # 绘制轮廓
            cv2.drawContours(frame, c, -1, (0, 0, 255), 2)
            # 计算轮廓矩
            m = cv2.moments(c)
            # 计算轮廓中心
            cx = int(m["m10"] / m["m00"])
            cy = int(m["m01"] / m["m00"])
            # 绘制中心点
            cv2.circle(frame, (cx, cy), 5, (0, 0, 255), 2)

        # 在窗口中显示采集到的图像
        cv2.imshow("camera", frame)
        cv2.imshow("test", binary)

    # 处理操作系统事件，参数是等待时间，单位ms
    # 返回按键编码
    if cv2.waitKey(1) == ord('q'):
        break

# 销毁窗口
cv2.destroyAllWindows()
# 关闭摄像头
camera.release()
